// keyof T，索引类型 表示 T 是某个对象的属性值对应的类型
// T[K] 索引操作访问符 可以理解为 T对象的K属性

function getProperty<T, K extends keyof T>(o: T, key: K): T[K] {
  return o[key]
}

// 映射类型 in 操作符 相当于遍历
type Keys = 'op1' | 'op2'
type Flags = { [K in Keys]: boolean }

// 等价于 
type Flags2 = {
  op1: boolean,
  op2: boolean
}